独習PHP:第8章 リクエスト情報
独習PHP:第8章 リクエスト情報
HTTPリクエストの話
世の中のwebアプリの基本
入力を受け取り→処理を行い→結果を出力する
クライアントからサーバに送られる情報のことをリクエスト情報と呼ぶ
この辺りはHTTPの理解をしておくべき
サーバーとクライアントが通信するときのプロトコルのこと
リクエストとレスポンス
クライアントがリクエスト情報(URLやヘッダー情報)を送り
HTTPメソッド
サーバーに対する直接の要求と取得するパス
リクエストヘッダー
リクエストの構成情報、クライアントの情報など
リクエストボディ
送信されたデータ
サーバーがレスポンス情報(コンテンツやヘッダー)を返す
HTTPステータス
サーバーでの処理結果を表すコード、メッセージ
レスポンスヘッダー
コンテンツの構成情報、サーバー情報
レスポンスボディ
コンテンツ本体
HTTP通信を確認する
chromeデベロッパーツールで確認する
HTML/CSSの確認、JSのデバッグ以外にも、ネットワークの通信状況、応答時間計測ができる
https://scrapbox.io/files/639db4c6d17eca001e279be5.png
全般: 通信状況の要約。
レスポンスヘッダー: 応答情報
リクエストヘッダー: 要求情報
webを支える技術をめっちゃ読もう
スーパーグローバル変数
PHPのもつ、リクエスト情報を取得 / 操作するための特別な変数
関数の内外に関わらず無条件でアクセスができるので、スーパーグローバルなのだ
$_POST
formメソッドとして、postで定義されたHTMLフォームから送信されたデータのこと
submitボタンでサーバーに送信される
🌟methodがGETの場合はクエリ情報(urlにつく形)で渡される
連想配列で示される。要素名(inputのname属性) => 値
送信するときはHTMLエスケープ処理を入れる
<>&"などを文字列に置き換える処理(<とか)
クロスサイトスクリプティングに引っかかるので気をつけよう
複数取得する場合
code:php
<input type="checkbox" name="lang[]" value="PHP">
<input type="checkbox" name="lang[]" value="Java">
<input type="submit" value="送信">
// nameを配列とすることで、get2.phppostされたファイル側で配列として取得できる
echo implode(',', $_POST'lang'); e関数について
関数をこう定義することがある
code:php
function e($str, string $charset = 'UTF-8'): string { ...
eという名前から情報が掴めない関数。コード読解の邪魔になるのでは?
スクリプトの随所から頻繁に呼ぶような関数は、入力手間の削減のために短い名前で定義することもある
htmlspecialchars()とかは最たる例
$_GET
クエリ情報として、クライアントからサーバーに対して情報を送る
URLの?移行で付加される簡単な情報
ハイパーリンク形式で値を渡すこともできる
code:php
// urlencode()関数: URLに使われる & や % を、URLに含めることができるよう文字列に変換する
<a href="get2.php?keyword=<?=urlencode('クエリ情報(&%)')?>">パイパーリンクで渡す</a>
// 指定したファイル
// ハイパーリンク: クエリ情報(&%)
ポストデータとクエリ情報
どちらも$_POST, $_GETで取得できる
開発者は使い分けをそこまで意識しなくてもいいのか?
デベロッパーツールでHTTP通信を見てみる
code:txt
// GET
GET /8_chapter/get2.php?keyword=%E3%82%AF%E3%82%A8%E3%83%AA%E6%83%85%E5%A0%B1(&%) HTTP/1.1
// POSTの方は、リクエストボディで送信されるのでリクエストヘッダーには表示されない
POST /8_chapter/post2.php HTTP/1.1
GETの制限について
データサイズに限界がある。URLの限られたブラウザやSEO、常識的なURLの長さを考えて。
クエリ情報がアドレス欄に表示される
かと言って、postを使えばデータが保護されるわけでもないのは気を付ける
https://scrapbox.io/files/639dc09b3ce5d7001da703a3.png
↑すぐバレる
ハイパーリンク経由の値の受け渡し
URLクエリなどで値を渡すこと。
&などが含まれているものをクエリ情報で渡す場合、urlencode()を使おう
8.4 ヘッダー情報
クライアントからサーバーに送信される情報は、ブラウザで目に見えるものだけではない。
ブラウザの種類や対応言語、リンク元のページなどの情報
不可視の情報のことをヘッダー情報、リクエストヘッダー情報と言う。
ヘッダー内容を見る
デベロッパツール→ネットワーク→リロードして増えていく項目をクリックで見れる
P370に一覧あり。
一般ヘッダー、リクエストヘッダー、レスポンスヘッダー、エンティティヘッダーと大きく4つに分けることができる
User-Agentヘッダーを使えばサイトにアクセスしてきたクライアント(ブラウザ)の種類がわかる
safariとchromeで処理を分けたりとかもできる。
Accept-Languageヘッダーは言語選択。日本語ユーザーには日本語で、などできるようになる
Content-Typeヘッダー
代表的なレスポンスヘッダー
クライアント(ブラウザ)がコンテンツを正しく処理するために必要な情報
リクエストヘッダを取得してみる
スーパーグローバル関数$_SERVERから取得できる。
ただし他にもサーバー変数の情報も含まれている。ヘッダー情報は見分けられるように命名規則がある
ハイフンはアンダースコアに変換されて表示されている
頭にHTTPとついている
dd($_SERVER)でOK
https://scrapbox.io/files/63cff1adc0fdc3001f30637a.png
意味を知りたくなったらP373を参照する
レスポンスヘッダーを設定する
クライアント→サーバに送られるリクエストヘッダー
サーバー→クライアントに送られるレスポンスヘッダー
PHP側でさっきリクエストを取得したが、レスポンスヘッダーを操作することもできる
code:php
<?php
// リダイレクトする
レスポンスヘッダーは、header()関数で操作ができる
Locationのヘッダー情報を操作している
これはリダイレクト先のURI(URL)を表すレスポンスヘッダー
リダイレクトしますよという操作に値を加えてリダイレクトされてるだけ
https://scrapbox.io/files/63cff3cb352d6e001eebe7e3.png
流れ(Client, Server)
C->S元ページを要求
S->Cロケーションヘッダーを発行(リクエストヘッダー)
C->SLocationヘッダーに書かれたURLを自動要求
S->C書かれたURLの処理結果を応答する
リダイレクト以外もヘッダーで命令できる
キャッシュ処理を無効にするCache-Controlや、ページの有効期限Expiresなど
header('HTTP/1.1 401 Unauthorized')とすれば、ページを非表示とすることもできる
https://scrapbox.io/files/63d2af2fceeb5e001e91868a.png
様々なファイルを生成する
クライアントは受信したコンテンツをどう処理するかを、Content-Typeヘッダーを見て決める
コンテンツタイプ
PHPは規定でtext/htmlというコンテンツタイプを送るので、従来は気にする必要はない。
HTML以外の要素を受け取らせたい場合は、スクリプト側で明示的にヘッダーを決めてやる必要がある。
PDFなら header('Content-Type: application/pdf')
code:php
// 任意のバイナリデータ ".csv"という名前をつけたらcsvで受け取らせる、など。
header("Content-Type: application/octet-stream");
// 強制ダウンロード、ダウンロード時に割り振られる名前の指定など。
header("Content-Disposition: attachment; filename=testdata.csv");